home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / dev / gcc / ixemul_src.lha / ixemul-41.0 / library / __unlock.c < prev    next >
C/C++ Source or Header  |  1995-05-20  |  3KB  |  94 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Library General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Library General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Library General Public
  16.  *  License along with this library; if not, write to the Free
  17.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  *  __unlock.c,v 1.1.1.1 1994/04/04 04:30:13 amiga Exp
  20.  *
  21.  *  __unlock.c,v
  22.  * Revision 1.1.1.1  1994/04/04  04:30:13  amiga
  23.  * Initial CVS check in.
  24.  *
  25.  *  Revision 1.3  1992/08/09  20:40:01  amiga
  26.  *  change to use 2.x header files by default
  27.  *
  28.  *  Revision 1.2  1992/07/28  02:50:59  mwild
  29.  *  call FreeDosObject instead of kfree() when > 1.3
  30.  *
  31.  *  Revision 1.1  1992/05/14  19:55:40  mwild
  32.  *  Initial revision
  33.  *
  34.  */
  35.  
  36. #define KERNEL
  37. #include "ixemul.h"
  38.  
  39. #if __GNUC__ != 2
  40. #define alloca __builtin_alloca
  41. #endif
  42.  
  43. int
  44. __unlock (BPTR lock)
  45. {
  46.   struct StandardPacket *sp;
  47.   
  48.   sp = alloca(sizeof(*sp)+2);
  49.   sp = LONG_ALIGN (sp);
  50.   __init_std_packet(sp);
  51.  
  52.   sp->sp_Pkt.dp_Port = u.u_sync_mp;
  53.   sp->sp_Pkt.dp_Type = ACTION_FREE_LOCK;
  54.   sp->sp_Pkt.dp_Arg1 = lock;
  55.  
  56.   PutPacket (((struct FileLock *)BTOCPTR (lock))->fl_Task, sp);
  57.   __wait_sync_packet (sp);
  58.   
  59.   /* set up Result2 so that the IoErr() works */
  60.   ((struct Process *)FindTask (0))->pr_Result2 = sp->sp_Pkt.dp_Res2;
  61.  
  62.   return sp->sp_Pkt.dp_Res1;
  63. }
  64.  
  65. /* ATTENTION: name-clash between sysio-__close and DOS-__Close !! */
  66. int
  67. __Close (BPTR fh)
  68. {
  69.   struct StandardPacket *sp;
  70.   struct FileHandle *fhp = BTOCPTR (fh);
  71.   
  72.   /* only do this is not closing a dummy NIL: filehandle */
  73.   if (fhp->fh_Type)
  74.     {
  75.       sp = alloca(sizeof(*sp)+2);
  76.       sp = LONG_ALIGN (sp);
  77.       __init_std_packet(sp);
  78.  
  79.       sp->sp_Pkt.dp_Port = u.u_sync_mp;
  80.       sp->sp_Pkt.dp_Type = ACTION_END;
  81.       sp->sp_Pkt.dp_Arg1 = fhp->fh_Arg1;
  82.  
  83.       PutPacket (fhp->fh_Type, sp);
  84.       __wait_sync_packet (sp);
  85.     }
  86.   
  87.   FreeDosObject (DOS_FILEHANDLE, fhp);
  88.  
  89.   /* set up Result2 so that the IoErr() works */
  90.   ((struct Process *)FindTask (0))->pr_Result2 = sp->sp_Pkt.dp_Res2;
  91.  
  92.   return sp->sp_Pkt.dp_Res1;
  93. }
  94.